src: Port to new OstreeAsyncProgress atomic API
authorPhilip Withnall <withnall@endlessm.com>
Fri, 28 Apr 2017 15:24:00 +0000 (16:24 +0100)
committerAtomic Bot <atomic-devel@projectatomic.io>
Sat, 29 Apr 2017 11:50:15 +0000 (11:50 +0000)
This will eliminate most of the potential races in progress reporting.
ostree_repo_pull_default_console_progress_changed() still calls three
getters, so there may still be races there, however.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
Closes: #819
Approved by: cgwalters

src/libostree/ostree-repo-pull.c
src/libostree/ostree-repo.c
src/ostree/ot-builtin-pull.c

index 3f5b771ca4ee35cc318c2ca2d554ac94a3c35988..f7dbd79e790ad1a414feadda38fe2f97608f4f7f 100644 (file)
@@ -211,36 +211,36 @@ update_progress (gpointer user_data)
   n_scanned_metadata = pull_data->n_scanned_metadata;
   start_time = pull_data->start_time;
 
-  ostree_async_progress_set_uint (pull_data->progress, "outstanding-fetches", outstanding_fetches);
-  ostree_async_progress_set_uint (pull_data->progress, "outstanding-writes", outstanding_writes);
-  ostree_async_progress_set_uint (pull_data->progress, "fetched", fetched);
-  ostree_async_progress_set_uint (pull_data->progress, "requested", requested);
-  ostree_async_progress_set_uint (pull_data->progress, "scanning", g_queue_is_empty (&pull_data->scan_object_queue) ? 0 : 1);
-  ostree_async_progress_set_uint (pull_data->progress, "scanned-metadata", n_scanned_metadata);
-  ostree_async_progress_set_uint64 (pull_data->progress, "bytes-transferred", bytes_transferred);
-  ostree_async_progress_set_uint64 (pull_data->progress, "start-time", start_time);
-
-  /* Deltas */
-  ostree_async_progress_set_uint (pull_data->progress, "fetched-delta-parts",
-                                  pull_data->n_fetched_deltaparts);
-  ostree_async_progress_set_uint (pull_data->progress, "total-delta-parts",
-                                  pull_data->n_total_deltaparts);
-  ostree_async_progress_set_uint (pull_data->progress, "fetched-delta-fallbacks",
-                                  pull_data->n_fetched_deltapart_fallbacks);
-  ostree_async_progress_set_uint (pull_data->progress, "total-delta-fallbacks",
-                                  pull_data->n_total_delta_fallbacks);
-  ostree_async_progress_set_uint64 (pull_data->progress, "fetched-delta-part-size",
-                                    pull_data->fetched_deltapart_size);
-  ostree_async_progress_set_uint64 (pull_data->progress, "total-delta-part-size",
-                                    pull_data->total_deltapart_size);
-  ostree_async_progress_set_uint64 (pull_data->progress, "total-delta-part-usize",
-                                    pull_data->total_deltapart_usize);
-  ostree_async_progress_set_uint (pull_data->progress, "total-delta-superblocks",
-                                  pull_data->static_delta_superblocks->len);
-
-  /* We fetch metadata before content.  These allow us to report metadata fetch progress specifically. */
-  ostree_async_progress_set_uint (pull_data->progress, "outstanding-metadata-fetches", pull_data->n_outstanding_metadata_fetches);
-  ostree_async_progress_set_uint (pull_data->progress, "metadata-fetched", pull_data->n_fetched_metadata);
+  ostree_async_progress_set (pull_data->progress,
+                             "outstanding-fetches", "u", outstanding_fetches,
+                             "outstanding-writes", "u", outstanding_writes,
+                             "fetched", "u", fetched,
+                             "requested", "u", requested,
+                             "scanning", "u", g_queue_is_empty (&pull_data->scan_object_queue) ? 0 : 1,
+                             "scanned-metadata", "u", n_scanned_metadata,
+                             "bytes-transferred", "t", bytes_transferred,
+                             "start-time", "t", start_time,
+                             /* Deltas */
+                             "fetched-delta-parts",
+                                  "u", pull_data->n_fetched_deltaparts,
+                             "total-delta-parts",
+                                  "u", pull_data->n_total_deltaparts,
+                             "fetched-delta-fallbacks",
+                                  "u", pull_data->n_fetched_deltapart_fallbacks,
+                             "total-delta-fallbacks",
+                                  "u", pull_data->n_total_delta_fallbacks,
+                             "fetched-delta-part-size",
+                                  "t", pull_data->fetched_deltapart_size,
+                             "total-delta-part-size",
+                                  "t", pull_data->total_deltapart_size,
+                             "total-delta-part-usize",
+                                  "t", pull_data->total_deltapart_usize,
+                             "total-delta-superblocks",
+                                  "u", pull_data->static_delta_superblocks->len,
+                             /* We fetch metadata before content.  These allow us to report metadata fetch progress specifically. */
+                             "outstanding-metadata-fetches", "u", pull_data->n_outstanding_metadata_fetches,
+                             "metadata-fetched", "u", pull_data->n_fetched_metadata,
+                             NULL);
 
   ostree_async_progress_set_status (pull_data->progress, NULL);
 
index ec2d8c832c6d13ed9b36d7c1f5e17f5984ad81d7..8e2b1c21d37d95323f90ea21eb386c0c280445d7 100644 (file)
@@ -3749,15 +3749,18 @@ ostree_repo_pull_default_console_progress_changed (OstreeAsyncProgress *progress
   buf = g_string_new ("");
 
   status = ostree_async_progress_get_status (progress);
-  outstanding_fetches = ostree_async_progress_get_uint (progress, "outstanding-fetches");
-  outstanding_metadata_fetches = ostree_async_progress_get_uint (progress, "outstanding-metadata-fetches");
-  outstanding_writes = ostree_async_progress_get_uint (progress, "outstanding-writes");
-  scanning = ostree_async_progress_get_uint (progress, "scanning") == 1;
-  n_scanned_metadata = ostree_async_progress_get_uint (progress, "scanned-metadata");
-  fetched_delta_parts = ostree_async_progress_get_uint (progress, "fetched-delta-parts");
-  total_delta_parts = ostree_async_progress_get_uint (progress, "total-delta-parts");
-  fetched_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "fetched-delta-fallbacks");
-  total_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "total-delta-fallbacks");
+
+  ostree_async_progress_get (progress,
+                             "outstanding-fetches", "u", &outstanding_fetches,
+                             "outstanding-metadata-fetches", "u", &outstanding_metadata_fetches,
+                             "outstanding-writes", "u", &outstanding_writes,
+                             "scanning", "u", &scanning,
+                             "scanned-metadata", "u", &n_scanned_metadata,
+                             "fetched-delta-parts", "u", &fetched_delta_parts,
+                             "total-delta-parts", "u", &total_delta_parts,
+                             "fetched-delta-fallbacks", "u", &fetched_delta_part_fallbacks,
+                             "total-delta-fallbacks", "u", &total_delta_part_fallbacks,
+                             NULL);
 
   if (status)
     {
@@ -3765,18 +3768,25 @@ ostree_repo_pull_default_console_progress_changed (OstreeAsyncProgress *progress
     }
   else if (outstanding_fetches)
     {
-      guint64 bytes_transferred = ostree_async_progress_get_uint64 (progress, "bytes-transferred");
-      guint fetched = ostree_async_progress_get_uint (progress, "fetched");
-      guint metadata_fetched = ostree_async_progress_get_uint (progress, "metadata-fetched");
-      guint requested = ostree_async_progress_get_uint (progress, "requested");
-      guint64 start_time = ostree_async_progress_get_uint64 (progress, "start-time");
-      guint64 total_delta_part_size = ostree_async_progress_get_uint64 (progress, "total-delta-part-size");
+      guint64 bytes_transferred, start_time, total_delta_part_size;
+      guint fetched, metadata_fetched, requested;
       guint64 current_time = g_get_monotonic_time ();
-      g_autofree char *formatted_bytes_transferred =
-        g_format_size_full (bytes_transferred, 0);
+      g_autofree char *formatted_bytes_transferred = NULL;
       g_autofree char *formatted_bytes_sec = NULL;
       guint64 bytes_sec;
 
+      /* Note: This is not atomic wrt the above getter call. */
+      ostree_async_progress_get (progress,
+                                 "bytes-transferred", "t", &bytes_transferred,
+                                 "fetched", "u", &fetched,
+                                 "metadata-fetched", "u", &metadata_fetched,
+                                 "requested", "u", &requested,
+                                 "start-time", "t", &start_time,
+                                 "total-delta-part-size", "t", &total_delta_part_size,
+                                 NULL);
+
+      formatted_bytes_transferred = g_format_size_full (bytes_transferred, 0);
+
       /* Ignore the first second, or when we haven't transferred any
        * data, since those could cause divide by zero below.
        */
index a7826542ead941bec2c661c5c3d7ce38813c8319..08f0028ae171ab4ed1aef56fb2122500c5735ee6 100644 (file)
@@ -89,20 +89,23 @@ dry_run_console_progress_changed (OstreeAsyncProgress *progress,
   g_assert (!printed_console_progress);
   printed_console_progress = TRUE;
 
-  /* Number of parts */
-  fetched_delta_parts = ostree_async_progress_get_uint (progress, "fetched-delta-parts");
-  total_delta_parts = ostree_async_progress_get_uint (progress, "total-delta-parts");
-  fetched_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "fetched-delta-fallbacks");
-  total_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "total-delta-fallbacks");
+  ostree_async_progress_get (progress,
+                             /* Number of parts */
+                             "fetched-delta-parts", "u", &fetched_delta_parts,
+                             "total-delta-parts", "u", &total_delta_parts,
+                             "fetched-delta-fallbacks", "u", &fetched_delta_part_fallbacks,
+                             "total-delta-fallbacks", "u", &total_delta_part_fallbacks,
+                             /* Size variables */
+                             "fetched-delta-part-size", "t", &fetched_delta_part_size,
+                             "total-delta-part-size", "t", &total_delta_part_size,
+                             "total-delta-part-usize", "t", &total_delta_part_usize,
+                             NULL);
+
   /* Fold the count of deltaparts + fallbacks for simplicity; if changing this,
    * please change ostree_repo_pull_default_console_progress_changed() first.
    */
   fetched_delta_parts += fetched_delta_part_fallbacks;
   total_delta_parts += total_delta_part_fallbacks;
-  /* Size variables */
-  fetched_delta_part_size = ostree_async_progress_get_uint64 (progress, "fetched-delta-part-size");
-  total_delta_part_size = ostree_async_progress_get_uint64 (progress, "total-delta-part-size");
-  total_delta_part_usize = ostree_async_progress_get_uint64 (progress, "total-delta-part-usize");
 
   buf = g_string_new ("");